"""Python中的函数是什么？"""

#在Python中，函数是一组执行特定任务的相关语句。
#函数有助于将我们的程序分解为较小的模块。随着我们的项目越来越大，函数使其变得更加有组织和易于管理。
#此外，它避免了重复写相同的代码，函数使代码可重复使用。

"""
函数语法
def function_name(parameters):
	"docstring"
    statement(s)
"""

#上面显示的是由以下组件组成的函数定义。
#def标记函数头开始的关键字。
#用于唯一标识函数的函数名称。函数命名遵循在Python中编写标识符的相同规则。
#通过其将值传递给函数的参数。它们是可选的。
#冒号（:)标记函数头的结尾。
#可选的文档字符串（docstring），用于描述函数的函数。
#组成函数体的一个或多个有效python语句。语句必须具有相同的缩进级别（通常为4个空格）。
#可选的return语句，用于从函数返回值。

def greet(name):
    """
    这是一个打招呼的函数，
    通过name参数传递，
    要打招呼的人名
    """
    print("Hello, " + name + ". Good morning!")

#如何在python中调用函数？

#定义函数后，我们可以从另一个函数，程序甚至Python提示符中调用它。要调用函数，我们只需键入带有适当参数的函数名称即可。
greet('Paul')

"""Docstrings(文档字符串)"""

#函数头之后的第一个字符串称为docstring，是文档字符串的缩写。简要说明了函数的作用。
#尽管是可选的，但文档是一种良好的编程习惯。除非您记得去年今天的晚餐时间和晚餐吃什么，否则请务必记录注释您的代码。
#在上面的示例中，我们在函数标头的正下方有一个文档字符串。我们通常使用三引号将文档字符串扩展为多行。该字符串可作为__doc__函数的属性供我们使用。

print(greet.__doc__)

"""
return 语句

return [expression_list]
该语句可以包含一个表达式，该表达式将被求值并返回值。如果该语句中没有表达式，或者return语句本身不存在于函数中，则该函数将返回None对象。
"""

print(greet("May"))
#None是返回值，因为greet()函数直接打印名称，并且没有使用return语句。

def absolute_value(num):
    """这个函数返回输入数字的绝对值"""

    if num >= 0:
        return num
    else:
        return -num


print(absolute_value(2))

print(absolute_value(-4))

"""变量的作用域和生命周期"""

#变量的作用域是程序中可以识别该变量的部分。从函数外部看不到在函数内部定义的参数和变量。因此，它们具有本地作用域。
#变量的生命周期是变量在内存中退出的时间。函数内部变量的生命周期与函数执行的时间一样长。
#一旦我们从函数返回，它们就会被销毁。因此，函数无法记住其先前调用中的变量值。
#这是一个示例，用于说明函数内部变量的生命周期。

def my_func():
    x = 10
    print("函数内部值:",x)
x = 20
my_func()
print("函数外部值:",x)

#在这里，我们可以看到x的初始值为20。即使函数my_func()将x的值更改为10，它也不会影响函数外部的值。
#这是因为函数内部的变量x与函数外部的x变量不同。尽管它们具有相同的名称，但是它们是两个具有不同作用域的不同变量。
#另一方面，从外部可以看到函数外部的变量。它们具有全局作用域，也就是函数内外部都可以使用该全局变量。
#我们可以从函数内部读取这些值，但不能更改（写入）它们。如果要在函数外部修改变量的值，必须使用关键字global，将它们声明为全局变量。

"""函数类型"""

#基本上，我们可以将函数分为以下两种类型：

#内置函数-Python内置的函数。
#用户定义的函数 -用户自己定义的函数。